package extration;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Map.Entry;

public class Polarite {

	//Les messages de cette polarite
	private ArrayList<Message> lesMessages;
	//Le type de polarite
	private String polarite;
	// Le nombre de message que contient cette polarite
	private int nbMessages;
	
	//Partie statistique
	private ArrayList<Mot> topSignificatif;
	private ArrayList<Mot> flopSignificatif;
	
	public Polarite(String p){
		lesMessages = new ArrayList<Message>();
		nbMessages=lesMessages.size();
		polarite = p;
	}
	
	//adder
	public void ajoutMessage(Message msg){
		lesMessages.add(msg);
	}
	
	//Calcul effectif
	public void effectifMot(int N){ 
		//Nombre de message contenant le mot dans P
		double a = 0.0;
		// Nombre de message NE contenant PAS le mot dans P
		double b = 0.0;
		//Nombre de message contenant le mot PAS dans P
		double c = 0.0;
		//Nombre de message NE contenant PAS le mot PAS dans P
		double d = 0.0;
		nbMessages = lesMessages.size();
		
		for(Message msg : lesMessages){
			for(Entry<Mot,Integer> hm : msg.getListeMot().entrySet()){
				Mot mot = hm.getKey();
				if(mot.getTabEffectifTh(polarite).isEmpty()){
					a = mot.getNbMsgPolarite(polarite);
					b = nbMessages - a;
					c = mot.getNbMsgNonPolarite(polarite);
					int nbMsgNonP = N - nbMessages;
					d = Math.abs(nbMsgNonP -c);
					mot.addTabEffectif(polarite,a, b, c, d);
					mot.calculTabEffectifTh(polarite,N);
				/*	if(mot.getChaine().equalsIgnoreCase("google")){
						System.out.println("a = " +  mot.getNbMsgPolarite(polarite));
						System.out.println(" b =" +  nbMessages + "-" + a + " => " + b);
						System.out.println("c =" + mot.getNbMsgNonPolarite(polarite) + "=> " + c);
						System.out.println("nbMsgNonP =" + N + "-" + nbMessages + "=>" + nbMsgNonP);
						System.out.println("d =" + nbMsgNonP +  "-" + c + "=> " + d);
						System.out.println("khi =" + mot.getKhiPolarite(Data.NEGATIVE));
					}*/
				}
				
			}
		}
	}
		
	//calcul du top 20 des plus significatives
	public void calculTopSignificatives(){
		this.topSignificatif = new ArrayList<Mot>();
		ArrayList<Mot> motsPolarite = new ArrayList<Mot>();
		for(Message msg : lesMessages){
			for(Entry<Mot,Integer> hm : msg.getListeMot().entrySet()){
				if(!motsPolarite.contains(hm.getKey()))
					motsPolarite.add(hm.getKey());
			}
		}
		MyComparator2 comparator = new MyComparator2(polarite);
		Collections.sort(motsPolarite, comparator);
		int taille = this.topSignificatif.size();
		for(int i=0; i<motsPolarite.size() & taille < Data.TOP ; i++){
			this.topSignificatif.add(motsPolarite.get(i));
			taille = this.topSignificatif.size();
		}
		
	}
	
	//calcul du flop 20 des moins significatives
		public void calculFlopSignificatives(){
			this.flopSignificatif = new ArrayList<Mot>();
			ArrayList<Mot> motsPolarite = new ArrayList<Mot>();
			for(Message msg : lesMessages){
				for(Entry<Mot,Integer> hm : msg.getListeMot().entrySet()){
					if(!motsPolarite.contains(hm.getKey()))
						motsPolarite.add(hm.getKey());
				}
			}
			MyComparator3 comparator = new MyComparator3(polarite);
			Collections.sort(motsPolarite, comparator);
			int taille = this.flopSignificatif.size();
			for(int i=0; i<motsPolarite.size() & taille < Data.TOP ; i++){
				this.flopSignificatif.add(motsPolarite.get(i));
				taille = this.flopSignificatif.size();
			}
			
		}
	
	//getter
	public ArrayList<Message> getMessages(){
		return lesMessages;
	}
	
	public ArrayList<Mot> getTopSignificatif(){
		return this.topSignificatif;
	}
	public ArrayList<Mot> getFlopSignificatif(){
		return this.flopSignificatif;
	}
	public int getNbOccTotal(){
		int nb=0;
		for(Message msg : lesMessages){
			for(Entry<Mot,Integer> hm : msg.getListeMot().entrySet()){
				nb+=hm.getValue();
			}
		}
		
		return nb;
	}
	
	//Remove mots
	public void removeMot(ArrayList<Mot> liste){
		this.lesMessages.removeAll(liste);
	}
}
